#ifndef E_ITEM_META_H
#define E_ITEM_META_H

#include "EString.h"
#include <DefineLibCommon.h>
#include <DefineCommon.h>

#include <EItemMetaProperty.h>
#include <EItemMetaFunction.h>

struct EItemMetaData;
class EItemMeta;
typedef SmartPtr(EItemMeta) EItemMetaPtr;
/**This class is used to represent a class's meta information,
 * which is same with QMetaObject. This can:
 * 1.creat a new class's object
 * 2.
 * */
class COMMON_DLL EItemMeta
{
public:
    EItemMeta();
    virtual ~EItemMeta();

    EString getClassName();
    void setClassName(const EString& className);

    EString getClassDescription();
    void setClassDescription(const EString& className);

    void addProperty(EItemMetaPropertyPtr p);
    void addProperty(const EString& name, const EVariant& value);

    EItemMetaPropertyPtr getProperty(int index);
    EItemMetaPropertyPtr getProperty(const EString& name);

    size_t getPropertyCount();
    
    void addFunction(EItemMetaFunctionPtr fun);
    EItemMetaFunctionPtr getFunction(int index);
    EItemMetaFunctionPtr getFunction(const EString& name);
    size_t getFunctionCount();

    EString getPrintStr();

protected:
    EString m_className;
    EString m_classDescription;
    EItemMetaData* m_data;
};

#endif // E_ITEM_META_H
